// 引入路由器
import router from './router'
// 引入仓库
import store from './store'
// element-ui件 消息提示框
import { Message } from 'element-ui'
// 引入进度条
import NProgress from 'nprogress' 
import 'nprogress/nprogress.css' 
// 进度条加载圈消失
NProgress.configure({ showSpinner: false }) // NProgress Configuration
// 引入自己封装的获取token的方法
import { getToken } from '@/utils/auth' 
// 设置页面标题的方法
import getPageTitle from '@/utils/get-page-title'

// 不用进行token检查的白名单路径数组
const whiteList = ['/login'] 

// 路由加载前
router.beforeEach(async(to, from, next) => {
  // 开始显示进度条
  NProgress.start()
  //设置整个页面的标题
  document.title = getPageTitle(to.meta.title)
  //获取token,判断是否登陆成功
  const hasToken = getToken()
  // 如果token存在(已经登陆或前面登陆过)
  if (hasToken) {
    // 如果请求的是登陆路由
    if (to.path === '/login') {
      // 直接跳转到根路由
      next({ path: '/' })
      //完成进度条
      NProgress.done()
    } else {// 请求的不是登陆路由
      // 是否已经登陆  !!强转布尔类型
      const hasGetUserInfo =  !!store.getters.name
      // 如果已经登陆直接放行
      if (hasGetUserInfo) {
        next()
      } else {// 如果还没有登陆
        try {
          // 异步请求获取用户信息(包含权限数据) ==> 动态注册用户的权限路由 => 当次跳转不可见
          await store.dispatch('user/getUserInfo')
          console.log(store.state.user.result1);
           //动态追加路由router.addRoute[最开始的时候已经注册常量路由:计算完毕的异步路由、任意路由] 
          router.addRoutes(store.state.user.result1)
          console.log('追加路由成功');
          next(to)// 重新跳转去目标路由, 能看到动态添加的异步路由, 且不会丢失参数
          // 完成进度条
          NProgress.done()
        } catch (error) {// 如果请求处理过程中出错
          // 重置用户信息;
          await store.dispatch('user/logout')
          // 提示错误信息
          // Message.error(error || 'Has Error') // axios拦截器中已经有提示了
          // 跳转到登陆页面, 并携带原本要跳转的路由路径, 用于登陆成功后跳转
          next(`/login?redirect=${to.path}`)
          // 完成进度条
          NProgress.done()
        }
      }
    }
  } else {// 没有token
    // 如果目标路径在白名单中(是不需要token的路径)
    if (whiteList.indexOf(to.path) !== -1) {
      // 放行
      next()
    } else {
      // 如果没在白名单中, 跳转到登陆路由携带原目标路径
      next(`/login?redirect=${to.path}`)
      // 完成进度条  当次跳转中断了, 要进行一个新的跳转了
      NProgress.done()
    }
  }
})
// 路由加载后
router.afterEach(() => {
  // 访问结束进度条消失
  NProgress.done()
})
